畫面顯示的差不多了,也能根據我們輸出的資料改變畫面上的內容了。
所以我們應該也學得差不多了吧!
當然沒有!作為一個網站服務,當然還要能傳遞資料,或者和使用者進行互動呀!
這次我們來做一個簡單的功能網頁!
首先,我們先來做一個簡單的機器人。這個機器人會隨機回傳以下一句激勵的名言給使用者。
我們設定 /inspiring
這個路徑,來滿足上面所說的需求
Route::get('/inspire');
接著,我們不在這裡宣告函式,而是給一段文字,標記應該使用的函式位置:
Route::get('/inspire', 'InspiringController@inspire');
這代表我們
然後,我們利用 artisan 來建立這個 Controller
$ php artisan make:controller InspiringController
Controller created successfully.
看起來成功囉!我們趕緊去 app/Http/Controllers
裡面看看有沒有成功建立
看起來成功囉!
接著,我們改寫 app/Http/Controllers/InspiringController.php
,加入我們在 routes 裡面宣告的函式:
class InspiringController extends Controller
{
/**
* @return string
*/
public function inspire()
{
return 'inspire';
}
}
接著,我們到 http://127.0.0.1/inspire 看看我們的結果
如果可以看到「inspire」這段文字,恭喜!我們成功的將routes 和控制器綁定在一起了!
現在我們遇到了一個小難題:這個需求勢必有一段程式要處理「從三句話中隨機選一句話給使用者看」的邏輯。
但是,這段邏輯要放在哪裡呢?哪邊才是最能適應需求改變的位置呢?
針對這個問題,相關討論很多,有點眾說紛紜。
筆者自己的習慣是將邏輯寫在 Services
裡面。然後由 Controllers
進行控制。筆者自己的經驗是,這樣可以最大程度的讓每個元件的職責拆分出來,並讓未來需求變更變得更簡單。
所以,我們來建立對應的 Service 物件,處理產生名言的邏輯吧!
首先,我們建立 app/Services
資料夾,並建立 app/Services/InspiringService.php
我們先從簡單開始,只回傳第一句激勵的名言:
<?php
namespace App\Services;
/**
* Class InspiringService
*/
class InspiringService
{
/**
* @return string
*/
public function inspire()
{
return '「失敗為成功之母。」- 愛迪生';
}
}
然後,我們修改一下原本的 InspiringController
,讓他使用 InspiringService
取得名言:
<?php
namespace App\Http\Controllers;
use App\Services\InspiringService;
use Illuminate\Http\Request;
class InspiringController extends Controller
{
/**
* @return string
*/
public function inspire()
{
return (new InspiringService())->inspire();
}
}
接著,我們重新回到 http://127.0.0.1/inspire ,看看我們的結果
如果所有步驟都正常,我們應該看到 「失敗為成功之母。」- 愛迪生 這句話
雖然成功了,但是我們沒有完成我們最原本的需求:隨機從三句名言裡面回傳一句激勵的名言。
沒關係,既然們已經把邏輯拉出來,要改哪隻檔案才能符合我們的需求就很明顯了:InspiringService
我們改寫一下原本的 inspire()
/**
* @return string
*/
public function inspire()
{
$quotes = [
'「失敗為成功之母。」- 愛迪生',
'「簡潔是最終的精密。」– 李奧納多‧達文西',
'「好的開始是成功的一半」- 荷拉斯',
];
$key = rand(0, 2);
return $quotes[$key];
}
好囉!現在我們重新整理一下畫面,應該可以時不時看到新的內容了!
小小總結一下我們這篇文章學習到了什麼
我們學到怎麼在 route 裡面宣告對應的控制器行為,還學到了怎麼撰寫對應的 Service 物件,讓商業邏輯能更加清楚。
希望各位覺得這篇文章有幫助,我們明天見!
Laravel 8 的話
語法要改為
Route::get('/inspire', [InspiringController::class, 'inspire']);
對的!感謝補充
之後考慮寫一系列 Laravel 8 的教學
補充 allen903405
laravel 8.0 route 沒有prefix namespace
因此需要自己設定namespace
所以有兩種做法
Route::get('/inspire', 'App\Http\Controllers\InspiringController@inspire');
或是
use App\Http\Controllers;
Route::get('/inspire', [InspiringController::class, 'inspire']);